package com.ruoyi.jdsq.controller;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.WordUtil;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.htgl.htbz.domain.HtglHtbzYsjf;
import com.ruoyi.infoRunTaskData.domain.InfoRunTaskData;
import com.ruoyi.infoRunTaskData.service.IInfoRunTaskDataService;
import com.ruoyi.jdsq.domain.JdysJdsqFj;
import com.ruoyi.jdsq.domain.JdysJdsqYjry;
import com.ruoyi.jdsq.mapper.JdysJdsqMapper;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import java.io.InputStream;
import java.util.Map;
import java.util.stream.IntStream;

import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.jdsq.domain.JdysJdsq;
import com.ruoyi.jdsq.service.IJdysJdsqService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;

/**
 * 鉴定申请Controller
 *
 * @author huacai
 * @date 2024-08-02
 */
@RestController
@RequestMapping("/jdsq/jdsq")
public class JdysJdsqController extends BaseController
{
    @Value(value = "${ruoyi.profile}")
    private String profile;

    @Resource
    private IJdysJdsqService jdysJdsqService;

    @Resource
    private IInfoRunTaskDataService iInfoRunTaskDataService;

    @Resource
    private JdysJdsqMapper jdysJdsqMapper;

    /**
     * 查询鉴定申请列表
     */
    @PreAuthorize("@ss.hasPermi('jdsq:jdsq:list')")
    @GetMapping("/list")
    public TableDataInfo list(JdysJdsq jdysJdsq)
    {
        startPage();
        List<JdysJdsq> list = jdysJdsqService.selectJdysJdsqList(jdysJdsq);
        return getDataTable(list);
    }

    /**
     * 查询附件列表
     */
    @GetMapping("/get/FileList/By/subId")
    public TableDataInfo selectJdsqFjList(JdysJdsqFj jdysJdsqFj){
        startPage();
        List<JdysJdsqFj> list = jdysJdsqService.selectJdsqFjList(jdysJdsqFj);
        return getDataTable(list);
    }

    /**
     * 导出鉴定申请列表
     */
    @PreAuthorize("@ss.hasPermi('jdsq:jdsq:export')")
    @Log(title = "鉴定申请", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, JdysJdsq jdysJdsq)
    {
        List<JdysJdsq> list = jdysJdsqService.selectJdysJdsqList(jdysJdsq);
        ExcelUtil<JdysJdsq> util = new ExcelUtil<JdysJdsq>(JdysJdsq.class);
        util.exportExcel(response, list, "鉴定申请数据");
    }

    /**
     * 下载模板
     */
    @PostMapping("/importTemplate")
    public void importTemplate(HttpServletResponse response)
    {
        ExcelUtil<JdysJdsq> util = new ExcelUtil<JdysJdsq>(JdysJdsq.class);
        util.importTemplateExcel(response, "鉴定申请数据");
    }

    /**
     * 导入数据
     */
    @Log(title = "鉴定申请", businessType = BusinessType.IMPORT)
    @PreAuthorize("@ss.hasPermi('jdsq:jdsq:import')")
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file) throws Exception
    {
        ExcelUtil<JdysJdsq> util = new ExcelUtil<JdysJdsq>(JdysJdsq.class);
        InputStream inputStream = file.getInputStream();
        List<JdysJdsq> list = util.importExcel(inputStream );
        inputStream.close();
        int count = jdysJdsqService.batchInsertJdysJdsq(list);
        return AjaxResult.success("导入成功" + count + "条信息！");
    }

    /**
     * 获取鉴定申请详细信息
     */
    @PreAuthorize("@ss.hasPermi('jdsq:jdsq:query')")
    @GetMapping(value = "/{jdsqId}")
    public AjaxResult getInfo(@PathVariable("jdsqId") String jdsqId)
    {
        return success(jdysJdsqService.selectJdysJdsqByJdsqId(jdsqId));
    }

    /**
     * 新增鉴定申请
     */
    @PreAuthorize("@ss.hasPermi('jdsq:jdsq:add')")
    @Log(title = "鉴定申请", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody JdysJdsq jdysJdsq) {
        jdysJdsq.setUserId(Math.toIntExact(getUserId()));
        int i = jdysJdsqService.insertJdysJdsq(jdysJdsq);
        //向流程业务表中加入数据
        InfoRunTaskData infoRunTaskData = new InfoRunTaskData();
        infoRunTaskData.setBusinessKey(jdysJdsq.getJdsqId());
        infoRunTaskData.setBusinessType(8); //业务模块: 鉴定验收-鉴定申请
        infoRunTaskData.setBusinessTitle(jdysJdsq.getCgName()); //任务名称: 成果名称
        infoRunTaskData.setApplyUser(SecurityUtils.getLoginUser().getUser().getNickName());//申请人

        iInfoRunTaskDataService.insertInfoRunTaskData(infoRunTaskData);

        return toAjax(i);
    }

    /**
     * 修改鉴定申请
     */
    @PreAuthorize("@ss.hasPermi('jdsq:jdsq:edit')")
    @Log(title = "鉴定申请", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody JdysJdsq jdysJdsq) {
        //修改业务中间表关系数据
        InfoRunTaskData infoRunTaskData = new InfoRunTaskData();
        infoRunTaskData.setBusinessTitle(jdysJdsq.getCgName()); //任务名称: 成果名称
        infoRunTaskData.setBusinessKey(jdysJdsq.getJdsqId());
        infoRunTaskData.setBusinessType(8); //业务模块: 鉴定验收-鉴定申请
        iInfoRunTaskDataService.updateInfoRunTaskDatas(infoRunTaskData); //注意updateInfoRunTaskDatas

        return toAjax(jdysJdsqService.updateJdysJdsq(jdysJdsq));
    }

    /**
     * 删除鉴定申请
     */
    @PreAuthorize("@ss.hasPermi('jdsq:jdsq:remove')")
    @Log(title = "鉴定申请", businessType = BusinessType.DELETE)
	@DeleteMapping("/{jdsqIds}")
    public AjaxResult remove(@PathVariable String[] jdsqIds) {
        //同时删除业务关系数据
        for (String jdsqId : jdsqIds) {
            JdysJdsq jdysJdsq = jdysJdsqService.selectJdysJdsqByJdsqId(jdsqId);
            iInfoRunTaskDataService.deleteData(jdysJdsq.getJdsqId(), 8);//业务模块: 鉴定验收-鉴定申请
        }
        return toAjax(jdysJdsqService.deleteJdysJdsqByJdsqIds(jdsqIds));
    }

    /**
     * 获得鉴定申请主键ID (UUID)
     */
    @GetMapping("/getJdSqId")
    public AjaxResult getJdSqId(){
        String jdSqId = IdUtils.fastSimpleUUID();
        return success(jdSqId);
    }

    /**
     * 获取鉴定申请与研究人员详细信息
     */
    @PreAuthorize("@ss.hasPermi('jdsq:jdsq:query')")
    @GetMapping(value = "/yjry/{jdsqId}")
    public AjaxResult selectJdysJdsqYjryByJdsqId(@PathVariable("jdsqId") String jdsqId) {
        return success(jdysJdsqService.selectJdysJdsqYjryByJdsqId(jdsqId));
    }

    /**
     * 新增附件
     */
    @PostMapping("/add/File/By/subId")
    public AjaxResult insertJdsqFjByJdsqId(@RequestBody JdysJdsqFj jdysJdsqFj) {
        return toAjax(jdysJdsqService.insertJdsqFjByJdsqId(jdysJdsqFj));
    }

    /**
     * 删除鉴定申请附件
     */
    @Log(title = "鉴定申请附件", businessType = BusinessType.DELETE)
    @DeleteMapping("/fj/{fjIds}")
    public AjaxResult remove(@PathVariable Integer[] fjIds)
    {
        return toAjax(jdysJdsqService.deleteJdysJdsqFjByFjIds(fjIds));
    }

    /**
     * 根据模板导出word
     * @param response
     * @return
     */
    @Log(title = "根据模板导出word", businessType = BusinessType.EXPORT)
    @PreAuthorize("@ss.hasPermi('occupation:basics:exportWord')")
    @GetMapping("/exportWord/{jdsqId}")
    public AjaxResult exportWord(@PathVariable("jdsqId") String jdsqId, HttpServletRequest request, HttpServletResponse response) {
        JdysJdsq Jdsq = jdysJdsqService.selectJdysJdsqByJdsqId(jdsqId);

        // 创建一个 SimpleDateFormat 对象，指定日期格式
        SimpleDateFormat sdfYMD = new SimpleDateFormat("yyyy年MM月dd日");
        Date sqJdTime = Jdsq.getSqJdTime(); //获取申请鉴定日期
        String newSqJdTime = sdfYMD.format(sqJdTime); // 使用 SimpleDateFormat 对象将 Date 对象格式化为 String 对象

        SimpleDateFormat sdfYM = new SimpleDateFormat("yyyy年MM月");
        Date xmQTime = Jdsq.getXmQTime(); //获取项目开始时间
        String newXmQTime = sdfYM.format(xmQTime); // 使用 SimpleDateFormat 对象将 Date 对象格式化为 String 对象
        Date xmZTime = Jdsq.getXmZTime(); //获取项目结束时间
        String newXmZTime = sdfYM.format(xmZTime); // 使用 SimpleDateFormat 对象将 Date 对象格式化为 String 对象

        String zyLyDict = Jdsq.getZyLy(); //专业领域 字典的键值
        String zyLy = DictUtils.getDictLabel("kylx_ssly", zyLyDict); //专业领域

        //fileType为技术成果报告的个数
        Integer jsCgBgFjSize = getJsCgBgTypeSize(jdsqId, "技术成果报告");

        //fileType为查新检索报告书的个数
        Integer cxJsBgsFjSize = getJsCgBgTypeSize(jdsqId, "查新检索报告书");

        //fileType为应用证明的个数
        Integer yyZmFjSize = getJsCgBgTypeSize(jdsqId, "应用证明");

        //fileType为经济效益证明的个数
        Integer jjXyZmFjSize = getJsCgBgTypeSize(jdsqId, "经济效益证明");

        //fileType为知识产权的个数
        Integer zsCqFjSize = getJsCgBgTypeSize(jdsqId, "知识产权");

        //fileType为已获奖励的个数
        Integer yhJlFjSize = getJsCgBgTypeSize(jdsqId, "已获奖励");

        //fileType为发表论文的个数
        Integer fbLwFjSize = getJsCgBgTypeSize(jdsqId, "发表论文");

        //fileType为申请表及相关的个数
        Integer sqbJXgFjSize = getJsCgBgTypeSize(jdsqId, "申请表及相关");

        //fileType为科技成果鉴定证书初稿的个数
        Integer kjCgJdZsCgFjSize = getJsCgBgTypeSize(jdsqId, "科技成果鉴定证书初稿");

        //fileType为科技成果鉴定证书终稿的个数
        Integer kjCgJdZsZgFjSize = getJsCgBgTypeSize(jdsqId, "科技成果鉴定证书终稿");

        //主要研究人员名单
        JdysJdsq jdysJdsq = jdysJdsqService.selectJdysJdsqYjryByJdsqId(jdsqId);
        List<JdysJdsqYjry> JdsqYjryList = jdysJdsq.getJdysJdsqYjryList();
        IntStream.range(0, JdsqYjryList.size())
                .forEach(i -> {
                    JdysJdsqYjry item = JdsqYjryList.get(i);
                    item.setNumNo(i + 1);
                    item.setZhiChen(DictUtils.getDictLabel("rcpt_zc", item.getZhiChen()));
                });

        Map<String, Object> map = new HashMap<>();

        map.put("cgName", Jdsq.getCgName()); //成果名称
        map.put("wcDw", Jdsq.getZyWcDw()); //完成单位
        map.put("sqJdDw", Jdsq.getSqJdDw()); //申请鉴定单位
        map.put("sqJdTime", newSqJdTime); //申请鉴定日期
        map.put("xmBh", Jdsq.getXmBh()); //项目编号
        map.put("zyWcr", Jdsq.getZyWcr()); //主要完成人
        map.put("newXmQTime", newXmQTime); //项目开始时间
        map.put("newXmZTime", newXmZTime); //项目结束时间
        map.put("xmFzName", Jdsq.getXmFzName()); //联系人(项目负责人)
        map.put("lxDh", Jdsq.getLxDh()); //联系电话
        map.put("txDz", Jdsq.getTxDz()); //通信地址
        map.put("zyLy", zyLy); //专业领域
        map.put("xmGs", Jdsq.getXmGs()); //任务来源(项目归属)
        map.put("jjXy", Jdsq.getJjXy()); //经济效益(万元)
        map.put("jsCgBgFjSize", jsCgBgFjSize); //附件中 技术成果报告 个数
        map.put("cxJsBgsFjSize", cxJsBgsFjSize); //附件中 查新检索报告书 个数
        map.put("yyZmFjSize", yyZmFjSize); //附件中 应用证明 个数
        map.put("jjXyZmFjSize", jjXyZmFjSize); //附件中 经济效益证明 个数
        map.put("zsCqFjSize", zsCqFjSize); //附件中 知识产权 个数
        map.put("yhJlFjSize", yhJlFjSize); //附件中 已获奖励 个数
        map.put("fbLwFjSize", fbLwFjSize); //附件中 发表论文 个数
        map.put("sqbJXgFjSize", sqbJXgFjSize); //附件中 申请表及相关 个数
        map.put("kjCgJdZsCgFjSize", kjCgJdZsCgFjSize); //附件中 科技成果鉴定证书初稿 个数
        map.put("kjCgJdZsZgFjSize", kjCgJdZsZgFjSize); //附件中 科技成果鉴定证书终稿 个数
        map.put("JdsqYjryList", JdsqYjryList); //主要研究人员名单


        String str = Jdsq.getCgName() + ".docx";
        //获取yml配置地址
        String tempDir = profile + "/upload/";
        String name = WordUtil.easyPoiExport("static/word/jdsq/jdsq.docx", tempDir, str, map, request, response);
        return AjaxResult.success(name);
    }

    /**
     * 根据jdsqId和fileType 查询附件中fileType为对应附件类型的个数
     * @param jdsqId 鉴定申请ID
     * @param fileType 附件类型
     * @return 对应附件的个数
     */
    private Integer getJsCgBgTypeSize(String jdsqId, String fileType) {
        JdysJdsqFj jdysJdsqFj = new JdysJdsqFj();
        jdysJdsqFj.setJdsqId(jdsqId);
        jdysJdsqFj.setFileType(fileType);
        List<JdysJdsqFj> jdysJdsqFjList = jdysJdsqService.selectJdsqFjList(jdysJdsqFj);

        return jdysJdsqFjList.size();
    }

}
